/**
 * @项目名称 longlonggo-sample
 * @文件名称 ProxyTest.java  版本号：1.0
 * @创建日期 2018年9月13日 
 * @创建作者 me@longlonggo.com
 */
package review.model.proxy;

import java.lang.reflect.Proxy;

/**
 * 说明： java代理测试类
 * 
 * @version 1.0
 * @author me@longlonggo.com
 *
 */
public class ProxyTest {
    public static void main(String[] args) {
        // 正常调用方式：父类声明子类实例化，即多态
        IBuy buy = new BuyImpl();
        buy.buyHouse();
        System.out.println("\n----------------------");

        // 【静态代理】
        // 使用代理方式(静态代理)：代理类，委托类都继承共同接口，代理类中定义接口声明的对象，通过拦截对象调用的方法达到拦截目的
        // 缺点：1、必须保证委托类存在接口；2、如果想对委托类的方法进行代理拦截，则接口中必须声明该方法
        // 使用buyHouse()时，可以在外部扩展添加处理逻辑(开闭原则)，而不用修改BuyProxyImpl代码
        BuyProxyImpl buyProxy = new BuyProxyImpl(buy);
        buyProxy.buyHouse();
        System.out.println("\n----------------------");

        // 【动态代理】
        IBuy dynamicBuy = (IBuy) Proxy.newProxyInstance(IBuy.class.getClassLoader(), 
                new Class[] { IBuy.class },
                new DynamicProxyHandler(buy));
        dynamicBuy.buyHouse();
    }
}
